package com.gb.web.common.utils;

import org.joda.time.DateTime;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期处理
 */
public class DateTimeUtil {
	/**
	 * 对日期的【秒】进行加/减
	 * @param date
	 *            日期
	 * @param seconds
	 *            秒数，负数为减
	 * @return 加/减几秒后的日期
	 */
	public static Date addDateSeconds(Date date, int seconds) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusSeconds(seconds).toDate();
	}

	/**
	 * 对日期的【分钟】进行加/减
	 * @param date
	 *            日期
	 * @param minutes
	 *            分钟数，负数为减
	 * @return 加/减几分钟后的日期
	 */
	public static Date addDateMinutes(Date date, int minutes) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusMinutes(minutes).toDate();
	}

	/**
	 * 对日期的【小时】进行加/减
	 * @param date
	 *            日期
	 * @param hours
	 *            小时数，负数为减
	 * @return 加/减几小时后的日期
	 */
	public static Date addDateHours(Date date, int hours) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusHours(hours).toDate();
	}

	/**
	 * 对日期的【天】进行加/减
	 * @param date
	 *            日期
	 * @param days
	 *            天数，负数为减
	 * @return 加/减几天后的日期
	 */
	public static Date addDateDays(Date date, int days) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusDays(days).toDate();
	}

	/**
	 * 对日期的【周】进行加/减
	 * @param date
	 *            日期
	 * @param weeks
	 *            周数，负数为减
	 * @return 加/减几周后的日期
	 */
	public static Date addDateWeeks(Date date, int weeks) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusWeeks(weeks).toDate();
	}

	/**
	 * 对日期的【月】进行加/减
	 * @param date
	 *            日期
	 * @param months
	 *            月数，负数为减
	 * @return 加/减几月后的日期
	 */
	public static Date addDateMonths(Date date, int months) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusMonths(months).toDate();
	}

	/**
	 * 对日期的【年】进行加/减
	 * @param date
	 *            日期
	 * @param years
	 *            年数，负数为减
	 * @return 加/减几年后的日期
	 */
	public static Date addDateYears(Date date, int years) {
		DateTime dateTime = new DateTime(date);
		return dateTime.plusYears(years).toDate();
	}

	/**
	 * 计算 minute 分钟后的时间
	 * @param date
	 * @param minute
	 * @return
	 */
	public static Date addMinute(Date date, int minute) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MINUTE, minute);
		return calendar.getTime();
	}

	public static Date addDate(Date tmpDate, int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(tmpDate);
		calendar.add(Calendar.SECOND, seconds);
		return calendar.getTime();
	}

	public static String addDay(Date s, int n) {
		SimpleDateFormat FORMATER_DATE_YMD = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cd = Calendar.getInstance();
		cd.setTime(s);
		cd.add(Calendar.DATE, n);// 增加一天
		// cd.add(Calendar.MONTH, n);//增加一个月
		return FORMATER_DATE_YMD.format(cd.getTime());
	}
	
	/**
    * 增加日期中某类型的某数值。如增加日期
    * @param date     日期
    * @param dateType 类型
    * @param amount   数值
    * @return 计算后日期
    */
   private static Date addInteger(Date date, int dateType, int amount) {
       Date myDate = null;
       if (date != null) {
           Calendar calendar = Calendar.getInstance();
           calendar.setTime(date);
           calendar.add(dateType, amount);
           myDate = calendar.getTime();
       }
       return myDate;
   }

	/**
	 * 增加日期的年份。失败返回null。
	 * @return 增加年份后的日期
	 */
	public static Date addYear(Date date, int yearAmount) {
		return addInteger(date, Calendar.YEAR, yearAmount);
	}

	/**
	 * 增加日期的月份。失败返回null。
	 * @return 增加月份后的日期
	 */
	public static Date addMonth(Date date, int yearAmount) {
		return addInteger(date, Calendar.MONTH, yearAmount);
	}

	/**
	 * 增加日期的天数。失败返回null。
	 * @return 增加天数后的日期
	 */
	public static Date addsDay(Date date, int dayAmount) {
		return addInteger(date, Calendar.DATE, dayAmount);
	}

	/**
	 * 增加日期的小时。失败返回null。
	 * @return 增加小时后的日期
	 */
	public static Date addHour(Date date, int hourAmount) {
		return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
	}

	/**
	 * 增加日期的分钟。失败返回null。
	 * @return 增加分钟后的日期
	 */
	public static Date addsMinute(Date date, int minAmount) {
		return addInteger(date, Calendar.MINUTE, minAmount);
	}

	/**
	 * 增加日期的秒钟。失败返回null。
	 * @return 增加秒钟后的日期
	 */
	public static Date addsSecond(Date date, int secondAmount) {
		return addInteger(date, Calendar.SECOND, secondAmount);
	}
	
	  /**
     * 得到指定日期当天的开始时间 （yyyy-MM-01 00:00:00.000）
     */
    public static Date getStartOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
    /**
     * 得到指定日期当天的结束时间 （yyyy-MM-dd 23:59:59.0）
     */
    public static Date getEndDateTimeOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH,0);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

   //获取当前日期 毫秒
  	public static long getTimeInMillis(){
  		Calendar now = Calendar.getInstance();
  		return now.getTimeInMillis();
  	}
  	
  	//获取当前日期 秒
  	public static long getTimeInSeconds(){
  		return getTimeInMillis()/1000L;
  	}
  	
  	
    /**
     * 按日加
     * @param value
     * @return
     */
    public static Date addDay(int value) {
        Calendar now = Calendar.getInstance();
        now.add(Calendar.DAY_OF_YEAR, value);//按日加
        //now.add(Calendar.MONTH, value);// 按月加
        //now.add(Calendar.YEAR, value);//按年加
        //now.add(Calendar.HOUR_OF_DAY, value);//按小时加
        //now.add(Calendar.MINUTE, value);//按分钟加
        return now.getTime();
    }

    /**
     * 按日加,指定日期
     * @param date
     * @param value
     * @return
     */
    public static Date addDay2(Date date, int value) {
        Calendar now = Calendar.getInstance();
        now.setTime(date);
        now.add(Calendar.DAY_OF_YEAR, value);//按日加,指定日期
        //now.add(Calendar.MONTH, value);//按月加,指定日期
        //now.add(Calendar.YEAR, value);//按年加,指定日期
        //now.add(Calendar.HOUR_OF_DAY, value);//按小时加,指定日期
        //now.add(Calendar.MINUTE, value);//按分钟加,指定日期
        return now.getTime();
    }

}
